package com.webauto.selenium;

import java.util.ArrayList;
import java.util.List;

import org.openqa.selenium.By;
import org.openqa.selenium.Keys;
import org.openqa.selenium.WebElement;
import org.openqa.selenium.interactions.Actions;
import org.openqa.selenium.support.ui.Select;
import org.openqa.selenium.support.ui.WebDriverWait;

import com.webauto.log.Log;
import com.webauto.test_case.BaseCase;

/**
 * PS:操作元素类
 * @author lkk
 *
 */
public class UseElementUtil {
	/**
	 * PS:点击指定元素
	 * @param by 位置对象
	 */
	public static void click(By by) {
		FindElementUtil.FindElementMeetClick(by).click();
	}
	
	/**
	 * PS:指定元素输入内容
	 * @param by 位置对象
	 * @param text 输入内容
	 */
	public static void sendKeys(By by,String text){
		FindElementUtil.waitFindElementForPageLoad(by).sendKeys(text);
	}
	
	/**
	 * PS:清空输入框输入
	 * @param by 位置对象
	 */
	public static void clear(By by) {
		FindElementUtil.waitFindElementForPageLoad(by).clear();
	}
	
	/**
	 * PS:获取指定元素的文本内容
	 * @param by 位置对象
	 * @return 元素的文本内容
	 */
	public static String getText(By by) {
		String result = null;
		try {
			WebElement element = FindElementUtil.waitFindElementForPageLoad(by);
			ManagerUtil.sleep(1000);
			result = element.getText();
		}catch (Exception e) {
			Log.error("+++获取元素文本异常+++");
		}
		return result;
	}
	
	/**
	 * PS:根据指定位置获取元素集合,再从元素集合的元素中抽出文本存入集合返回
	 * @param by 位置元素
	 * @return 文本集合
	 */
	public static List<String> getTexts(By by) {
		List<String> texts = new ArrayList<String>();
		List<WebElement> webElements = FindElementUtil.findElements(by);
		for(WebElement webElement:webElements) {
			String text = webElement.getText();
			texts.add(text);
		}
		return texts;
	}
	
	/**
	 * PS:获取指定位置的属性值
	 * @param by 位置对象
	 * @param name 属性名
	 * @return 属性值
	 */
	public static String getAttribute(By by,String name) {
		String value = FindElementUtil.waitFindElementForPageLoad(by).getAttribute(name);
		return value;
	}
	
	/**
	 * PS:根据下标选中下拉选项
	 * @param by 位置对象
	 * @param index 下标
	 */
	public static void selectByIndex(By by,int index) {
		//获取select对象
		Select select = getSelect(by);
		//根据索引选中下拉选项
		select.selectByIndex(index);
	}
	
	/**
	 * PS:根据value属性选中下拉选项
	 * @param by 位置对象
	 * @param value 属性值
	 */
	public static void selectByValue(By by,String value) {
		//获取select对象
		Select select = getSelect(by);
		//根据value属性选中下拉选项
		select.selectByValue(value);
	}
	
	/**
	 * PS:根据下拉选项的文本值选中下拉选项
	 * @param by 位置对象
	 * @param text 下拉选项文本值
	 */
	public static void selectByVisibleText(By by,String text) {
		//获取select对象
		Select select = getSelect(by);
		//根据选项文本值选中下拉选项
		select.selectByVisibleText(text);
	}
	/**
	 * PS:返回下拉选项对象
	 * @param by
	 * @return
	 */
	public static Select getSelect(By by) {
		//select框元素对象
		WebElement webElement = FindElementUtil.waitFindElementForPageLoad(by);
		//获取select对象
		Select select = new Select(webElement);
		return select;
	}
	
	/**
	 * PS:获取指定位置下拉选项的所有选项元素集合
	 * @param by 位置对象
	 * @return 下拉选项元素集合
	 */
	public static List<WebElement> getOptions(By by) {
		//获取select对象
		Select select = getSelect(by);
		//获取下拉选项元素对象集合
		List<WebElement> options = select.getOptions();
		return options;
	}
	
	/**
	 * PS:双击指定元素
	 * @param by 位置对象
	 */
	public static void doubleClick(By by) {
		Actions actions = new Actions(BaseCase.driver);
		WebElement webElement = FindElementUtil.waitFindElementForPageLoad(by);
		//利用js将定位到的元素拖动到可见区域
		ManagerUtil.executeScript("arguments[0].scrollIntoView();", webElement);
		actions.doubleClick(webElement).perform();;
	}
	
	/**
	 * PS:鼠标悬停到指定元素
	 * @param by 位置对象
	 */
	public static void moveToElement(By by) {
		Actions actions = new Actions(BaseCase.driver);
		WebElement webElement = FindElementUtil.waitFindElementForPageLoad(by);
		//利用js将定位到的元素拖动到可见区域
		ManagerUtil.executeScript("arguments[0].scrollIntoView();", webElement);
		actions.moveToElement(webElement).perform();
	}
	
	/**
	 * PS:右击元素对象
	 * @param by 位置对象
	 */
	public static void contextClick(By by) {
		Actions actions = new Actions(BaseCase.driver);
		WebElement webElement = FindElementUtil.waitFindElementForPageLoad(by);
		//利用js将定位到的元素拖动到可见区域
		ManagerUtil.executeScript("arguments[0].scrollIntoView();", webElement);
		actions.contextClick(webElement);
	}
	
	/**
	 * PS:键盘输入指定文字到指定元素
	 * @param by 元素位置对象
	 * @param text 输入文字
	 */
	public static void keyboardSendKeys(By by,String text) {
		Actions actions = new Actions(BaseCase.driver);
		WebElement webElement = FindElementUtil.waitFindElementForPageLoad(by);
		//利用js将定位到的元素拖动到可见区域
		ManagerUtil.executeScript("arguments[0].scrollIntoView();", webElement);
		actions.click(webElement).perform();
		actions.sendKeys(text).perform();
	}
}
